 package com.accp.ssmoa.rest.editor;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import org.activiti.editor.constants.ModelDataJsonConstants;
import org.activiti.engine.ActivitiException;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.Model;
import org.apache.batik.transcoder.TranscoderInput;
import org.apache.batik.transcoder.TranscoderOutput;
import org.apache.batik.transcoder.image.PNGTranscoder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ModelSaveRestResource
  implements ModelDataJsonConstants
{
  protected static final Logger LOGGER = LoggerFactory.getLogger(ModelSaveRestResource.class);

  @Autowired
  private RepositoryService repositoryService;

  @Autowired
  private ObjectMapper objectMapper;

  @RequestMapping(value={"service/modelEditor/save/saveModel"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
  @ResponseStatus(HttpStatus.OK)
  public void saveModel(@RequestParam("modelId") String modelId, 
		  @RequestBody MultiValueMap<String, String> values) { 
	  
	  try { 
		  
		  Model model = this.repositoryService.getModel(modelId);
	  	  System.out.println("ModelSaveRestResource.saveModel----------");
	      ObjectNode modelJson = (ObjectNode)this.objectMapper.readTree(model.getMetaInfo());
	
	      modelJson.put("name", (String)values.getFirst("name"));
	      modelJson.put("description", (String)values.getFirst("description"));
	      model.setMetaInfo(modelJson.toString());
	      model.setName((String)values.getFirst("name"));
	
	      this.repositoryService.saveModel(model);
	
	      this.repositoryService.addModelEditorSource(model.getId(), ((String)values.getFirst("json_xml")).getBytes("utf-8"));
	
	      InputStream svgStream = new ByteArrayInputStream(((String)values.getFirst("svg_xml")).getBytes("utf-8"));
	      TranscoderInput input = new TranscoderInput(svgStream);
	
	      PNGTranscoder transcoder = new PNGTranscoder();
	
	      ByteArrayOutputStream outStream = new ByteArrayOutputStream();
	      TranscoderOutput output = new TranscoderOutput(outStream);
	
	      transcoder.transcode(input, output);
	      byte[] result = outStream.toByteArray();
	      this.repositoryService.addModelEditorSourceExtra(model.getId(), result);
	      outStream.close();
	    } catch (Exception e){
	      LOGGER.error("Error saving model", e);
	      throw new ActivitiException("Error saving model", e);
	    }
  }
}